<html>
    <head>
        <title>使用IFeatureChecker服务检查功能</title>
    </head>
    <body>
        <script>
            /*
                2、使用 IFeatureChecker 服务检查功能

                                                 IFeatureChecker 允许检查应用程序代码中的功能。

                                        ①、IsEnabledAsync方法
                                                                
                                                如果启用了给定功能，则返回true。因此，你可以有条件地执行你的业务流程。

                                                eg:  检查是否启用了"PDF" 报告功能

                                                    public class ReportingAppService : ApplicationService, IReportingAppService
                                                    {
                                                        private readonly IFeatureChecker _featureChecker;

                                                        public ReportingAppService(IFeatureChecker featureChecker)
                                                        {
                                                            _featureChecker = featureChecker;  // 注入 IFeatureChecker  功能检查服务
                                                        }

                                                        public async Task<PdfReportResultDto> GetPdfReportAsync()
                                                        {
                                                            if (await _featureChecker.IsEnabledAsync("MyApp.PdfReporting"))  // 检查是否启用了"PDF" 报告功能
                                                            {
                                                                //TODO...
                                                            }
                                                            else
                                                            {
                                                                //TODO...   
                                                            }
                                                        }
                                                    }


                                                IsEnabledAsync具有重载以检查一个方法调用中的多个功能。


                                        ②、GetOrNullAsync 方法

                                                获取功能的当前值。一方法返回一个 string ,因此你可以通过与string相互转换来在其中存储任何类型的值。

                                                eg： 检查允许的最大产品计数：

                                                    public class ProductController : AbpController
                                                    {
                                                        private readonly IFeatureChecker _featureChecker;

                                                        public ProductController(IFeatureChecker featureChecker)
                                                        {
                                                            _featureChecker = featureChecker; // 注入 IFeatureChecker 功能检查服务
                                                        }

                                                        public async Task<IActionResult> Create(CreateProductModel model)
                                                        {
                                                            var currentProductCount = await GetCurrentProductCountFromDatabase();

                                                            //GET THE FEATURE VALUE
                                                            var maxProductCountLimit =
                                                                await _featureChecker.GetOrNullAsync("MyApp.MaxProductCount"); // GetOrNullAsync 返回一个string

                                                            if (currentProductCount >= Convert.ToInt32(maxProductCountLimit))
                                                            {
                                                                throw new BusinessException(
                                                                    "MyApp:ReachToMaxProductCountLimit",
                                                                    $"You can not create more than {maxProductCountLimit} products!"
                                                                );
                                                            }

                                                            //TODO: Create the product in the database...
                                                        }

                                                        private async Task<int> GetCurrentProductCountFromDatabase()
                                                        {
                                                            throw new System.NotImplementedException();
                                                        }
                                                    }

                                                此示例使用数值作为SaaS应用程序中用户/租户的功能限制产品计数

                                                你可以使用GetAsync方法的通用重载，而不是手动将值转换为int：

                                                            var maxProductCountLimit = await _featureChecker.GetAsync<int>("MyApp.MaxProductCount");
                                        
                                        
                                        ③、扩展方法

                                                IFeatureChecker 接口有一些有用的扩展方法：

                                                            Task<T> GetAsync<T>(string name, T defaultValue = default)：
                                                                        用于获取给定类型T的特征的值。允许指定当特征值为null时返回的defaultValue。

                                                            CheckEnabledAsync(string name)：
                                                                        检查给定功能是否已启用。如果该功能不是true（已启用），则抛出AbpAuthorizationException。

            */
        </script>
    </body>
</html>